﻿using Common;
using System.Collections;
using System.Collections.Generic;
using Tedu.ARPGDemo.Character;
using UnityEngine;

namespace ARPGDemo.Skill
{
	/// <summary>
    /// 技能管理器：主要负责技能释放前的工作。
    /// </summary>
	public class CharacterSkillManager : MonoBehaviour {
        //技能列表
        public List<SkillData> skills;
        //技能初始化
        private void Start()
        {
            for (int i = 0; i < skills.Count; i++)
            {
                SkillInit(skills[i]);
            }
            
        }
        private void SkillInit(SkillData data)
        {
            //只知道名字加载资源
            //预制件名称=完整路径
            //预制件
            //data.skillPrefab = Resources.Load<GameObject>("Skill/" + data.prefabName);//这里名字写死了，有两个解决方法，注意/
            //解决方案1：//1读取配置文件//2根据资源名称获取完成路径//3加载资源
            //解决方案2：//加载资源单独类ResourceManager做
            //根据资源名称（自动匹配路径加载资源）
            data.skillPrefab = ResourceManager.Load<GameObject>(data.prefabName);
            //技能所属
            data.owner = gameObject;
        }
        //准备技能（冷却时间、法力）
        public SkillData PrepareSkill(int id)
        {
            //根据ID查找技能
            var data = skills.Find(s => s.skillID == id);
            //判断条件
            if (data!=null && data.coolRemain <= 0 && data.costSP <= GetComponent<CharacterStatus>().SP)
            {
                return data;
            }
            return null;
        }
        //生成技能
        public void GenerateSkill(SkillData data)
        {
            //通过对象池创建技能预制件
            var skillGo = GameObjectPool.Instance.CreateObject(data.prefabName, data.skillPrefab, transform.position, transform.rotation);//应用的时候注意根据key值data.prefabName生成
            var deployer = skillGo.GetComponent<SkillDeployer>();
            //设置技能释放器的技能数据
            deployer.CurrentSkillData = data;//释放器内部在创建算法对象
            //调用技能释放器的释放方法
            deployer.DeployerSkill();//执行算法对象
            //开启冷却
            StartCoroutine(CoolTimeDown(data));
            //【暂时...】回收技能//以后不放在这里做
            //GameObjectPool.Instance.CollectObject(skillGo, data.durationTime);
        }
        //冷却技能
        private IEnumerator CoolTimeDown(SkillData data)
        {
            data.coolRemain = data.coolTime;
            while (data.coolRemain > 0)
            {
                //coolRemain一秒自减一次，直到减完
                yield return new WaitForSeconds(1);
                data.coolRemain--;
            }
        }
    }
}

